#ifndef MAVLINK_HANDLER_H
#define MAVLINK_HANDLER_H

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>

#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"

#include "mavlink/common/mavlink.h"
#include "mavlink/custom/mavlink.h"
#include "mavlink/custom/mavlink_msg_guide_ack.h"
#include "mavlink/custom/mavlink_msg_guide_board.h"
#include "mavlink/custom/mavlink_msg_uav_mavlink_id.h"
#include "mavlink/common/mavlink_msg_mission_item_int.h"
#include "mavlink/common/mavlink_msg_command_long.h"
#include "mavlink/ardupilotmega/ardupilotmega.h"
#include "task_tracker.h"

#ifdef __cplusplus
extern "C" {
#endif

// 配置定义
#define MAVLINK_UART_NUM UART_NUM_1
#define MAVLINK_TXD_PIN (GPIO_NUM_16) // XIAO ESP36
#define MAVLINK_RXD_PIN (GPIO_NUM_17) // XIAO ESP36

// #define MAVLINK_TXD_PIN (GPIO_NUM_1) // ESP36 普通大的
// #define MAVLINK_RXD_PIN (GPIO_NUM_3) // ESP36 普通大的

#define MAVLINK_BUF_SIZE (1024)

// 准备解锁检查相关定义
#define LOW_BATTERY_VOLT 10500  // 低电压阈值 (mV)
#define MIN_GPS_SATELLITES 6    // 最少GPS卫星数
#define EKF_ATTITUDE 0x01       // EKF姿态标志位

// 飞控目标ID
// #define TARGET_SYSTEM  255  // 定义系统ID
// #define TARGET_COMPONENT 1   // 定义组件ID
extern uint8_t target_system;
extern uint8_t target_component;

extern uint32_t g_device_id;

// 航线状态枚举
typedef enum {
    MISSION_STATE_IDLE,
    MISSION_STATE_CLEARING,
    MISSION_STATE_UPLOADING,
    MISSION_STATE_FINISHED
} mission_state_t;

// 目标装订结果枚举
typedef enum {
    GUIDE_ACK_SUCCESS = 1,     // 装订成功
    GUIDE_ACK_FAILED = 0       // 装订失败
} guide_ack_result_t;

// 目标装订确认信息结构体
typedef struct {
    uint8_t upload_flag;       // 原始标志位
    guide_ack_result_t result; // 解析后的结果
    const char* result_msg;    // 结果描述信息
    uint32_t timestamp;        // 接收时间戳(可选)
} guide_ack_info_t;

// 准备解锁状态检查结构
typedef struct {
    bool system_standby;        // 系统处于待机状态
    bool not_armed;            // 当前未解锁
    bool no_prearm_errors;     // 无预解锁错误
    bool ekf_ok;               // EKF状态良好
    bool gps_ok;               // GPS状态良好 (如果需要GPS)
    bool battery_ok;           // 电池电压正常
    uint32_t last_check_time;  // 最后检查时间
    uint32_t last_prearm_error_time;
} prearm_check_t;

// MAVLink状态结构体
typedef struct {
    bool self_check_passed;    // 自检状态
    bool is_armed;            // 是否已解锁
    bool has_target;          // 是否装订目标
    uint32_t custom_mode;     // 飞行模式
    mission_state_t mission_state;  // 航线状态
    uint16_t mission_count;        // 航线点数量
    uint16_t mission_current_index; // 当前航线点索引
    uint32_t arm_command_timer;    // 解锁命令计时器
    bool arm_command_sent;         // 解锁命令发送标志
    uint32_t guide_send_timer;     // 目标发送计时器
    bool guide_sent;              // 目标发送标志
    prearm_check_t prearm_status;  // 预解锁状态
} mavlink_state_t;

// 全局状态变量（在mavlink_handler.c中定义）
extern mavlink_state_t mavlink_state;


// 互斥锁（在mavlink_handler.c中定义）
extern SemaphoreHandle_t mavlink_state_mutex;

// 状态访问函数声明
void mavlink_state_init(void);
bool mavlink_state_lock(TickType_t timeout);
void mavlink_state_unlock(void);

// 安全的状态访问宏
#define MAVLINK_STATE_LOCK_TIMEOUT_MS 100
#define MAVLINK_STATE_LOCK() mavlink_state_lock(pdMS_TO_TICKS(MAVLINK_STATE_LOCK_TIMEOUT_MS))
#define MAVLINK_STATE_UNLOCK() mavlink_state_unlock()

// 安全的状态读取函数
bool mavlink_get_armed_status(void);
bool mavlink_get_has_target(void);
mission_state_t mavlink_get_mission_state(void);
uint16_t mavlink_get_mission_count(void);
uint16_t mavlink_get_mission_index(void);


// 安全的状态设置函数
void mavlink_set_armed_status(bool armed);
void mavlink_set_self_check_status(bool passed);
void mavlink_set_has_target(bool has);
void mavlink_set_mission_state(mission_state_t state);
void mavlink_set_mission_count(uint16_t count);
void mavlink_set_mission_index(uint16_t index);
void mavlink_set_mission_upload_state(uint16_t count, uint16_t index, mission_state_t state);

// ===== 添加状态回调函数声明 =====

// 回调函数类型定义
typedef void (*guide_ack_callback_t)(bool success);
typedef void (*mission_ack_callback_t)(bool success);

// // 外部回调函数声明（在main.c中实现）
// guide_ack_callback_t guide_ack_callback;
// mission_ack_callback_t mission_ack_callback;

// 设置回调函数的接口
void mavlink_set_guide_ack_callback(guide_ack_callback_t callback);
void mavlink_set_mission_ack_callback(mission_ack_callback_t callback);

void switch_to_mission_mode(void);
void send_takeoff_command(float altitude);
void switch_to_guide_mode(void);
void switch_to_throw_mode(void);
typedef struct {
    float alt;
    double lon;
    double lat;
    float speed;
} waypoint_t;

// 航线点数据结构（与main.c中的结构保持一致）
typedef struct {
    uint16_t target_id;
    uint8_t target_type;
    uint8_t strike_type;
    float target_alt;
    double target_lon;
    double target_lat;
    char photo_url[128];
    waypoint_t waypoints[10];
    uint8_t waypoint_count;
} drone_task_t;

// 函数声明
void mavlink_handler_init(void);
void mavlink_task(void *pvParameters);
// bool mavlink_get_arm_status(void);
bool mavlink_get_self_check_status(void);
// uint32_t mavlink_get_flight_mode(void);
void mavlink_send_guide_target(int32_t lat, int32_t lon, float alt, int8_t target_type);
// void mavlink_send_mission_upload(void);
void mavlink_force_arm(bool arm);

// UART相关函数
void mavlink_uart_init(void);
void mavlink_send_heartbeat(void);

// MAVLink消息解析函数
void mavlink_parse_message(const mavlink_message_t *msg);
int mavlink_parse_guide_ack_message(const mavlink_message_t* msg, guide_ack_info_t* ack_info);

// 预解锁检查函数
bool mavlink_check_prearm_ready(void);

// MAVLink命令发送函数
void mavlink_send_arm_disarm_command(uint8_t target_system, uint8_t target_component, bool arm);
// void mavlink_send_mission_clear_all(uint8_t target_system, uint8_t target_component);
void mavlink_send_mission_count(uint8_t target_system, uint8_t target_component, uint16_t count);
void send_mission_items(uart_port_t uart_num, uint8_t target_system, uint8_t target_component, uint16_t requested_seq);
void send_mission_item_int(uart_port_t uart_num, uint8_t target_system, uint8_t target_component, 
                          uint16_t seq, uint8_t frame, uint16_t command, uint8_t current, 
                          uint8_t autocontinue, float param1, float param2, float param3, float param4,
                          int32_t x, int32_t y, float z);
void mavlink_send_guide_board_target(uint8_t target_sys, uint8_t target_comp,
                                    int32_t lat, int32_t lon, float alt, int8_t target_type);
void mavlink_mission_clear_all(); // 清楚航线
// 航线数据访问函数声明（需要在main.c中实现）
extern bool get_current_mission_data(drone_task_t *task_data);
extern bool has_valid_mission_data(void);
extern SemaphoreHandle_t task_tracker_mutex;

#ifdef __cplusplus
}
#endif

#endif // MAVLINK_HANDLER_H